home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / graphics / 3dvect30.arj / MAIN.ASM < prev    next >
Assembly Source File  |  1993-11-18  |  14KB  |  422 lines

  1.            .386p
  2.            jumps
  3.  
  4. code32     segment para public use32
  5.            assume cs:code32, ds:code32
  6.  
  7. ; define externals
  8.  
  9.            include pmode.inc       ; protected mode externals
  10.            include xmouse.inc      ; xmode mouse externals
  11.            include xmode.inc       ; xmode externals by matt pritchard
  12.            include 3d.inc
  13.            include irq.inc
  14.            include stars.inc
  15.            include font.inc
  16.            include file.inc
  17.  
  18.            include macros.inc
  19.            include equ.inc
  20.  
  21.            include sphere.inc
  22.            include icon.inc
  23.            include gamecolr.inc    ; dac palette
  24.  
  25.            include objects.inc     ; table of shapes/colours
  26.            include stuff.inc       ; ending screen stuff
  27.  
  28.            public _main
  29.  
  30. _main:
  31.            sti
  32.  
  33.            push offset defpal
  34.            call fadeoffpalette
  35.  
  36.            call setup_env          ; set up file envirionment (eg c:\temp\thisprog.exe )
  37.  
  38.            pushw xmode
  39.            pushw xactual
  40.            pushw yactual
  41.            pushw pages
  42.            call set_vga_modex
  43.            cmp ax,-1               ; test for error in setting videomode
  44.            jne getout
  45.  
  46.            call wipeoffpalette
  47.  
  48. ;          call set_pmirq          ; select irq:use one or the other
  49.            call set_rmirq
  50.  
  51. ;          push offset gamecolr
  52. ;          pushw 0
  53. ;          pushw 255
  54. ;          pushw 1
  55. ;          call load_dac_registers
  56.  
  57.            call setupbase
  58.            call initpages
  59.            call initfont
  60.            call show_mouse
  61.  
  62.           ;block 0,0,319,399,14
  63.           ;call flip_page
  64.           ;block 0,0,319,399,14
  65.  
  66. comment $
  67.            call flip_page    ; example of how to draw a single polygon
  68.  
  69.            p1x equ -50
  70.            p1y equ -50
  71.            p2x equ -90
  72.            p2y equ 70
  73.            p3x equ 60
  74.            p3y equ 80
  75.  
  76.            mov x1,p1x
  77.            mov y1,p1y
  78.            mov x2,p2x
  79.            mov y2,p2y
  80.            call fakeline
  81.  
  82.            mov x1,p2x
  83.            mov y1,p2y
  84.            mov x2,p3x
  85.            mov y2,p3y
  86.            call fakeline
  87.  
  88.            mov x1,p3x
  89.            mov y1,p3y
  90.            mov x2,p1x
  91.            mov y2,p1y
  92.            call fakeline
  93.  
  94.            mov colq,7
  95.            mov steel,-1
  96.            call poly_fill
  97.  
  98.            call flip_page
  99. $
  100.            mov esi,o runscreen ; this uses the new font/screen setup routines
  101.            call tstring
  102.            mov esi,o runtext
  103.            call tstring
  104.  
  105.            push o gamecolr
  106.            call fadeonpalette
  107.  
  108.            mov si,cameraobject  ; set the camera position
  109.            mov bx,0             ; camera angle
  110.            mov cx,0
  111.            mov bp,0
  112.            call set_angle
  113.            mov ebx,100000       ; camera position
  114.            mov ecx,25000
  115.            mov ebp,-315000
  116.            call put_object
  117.  
  118.            mov si,1             ; now place 1st object
  119.            mov ebx,-26000       ; to this position (x,y,z)=ebx,ecx,ebp
  120.            mov ecx,65000        ; locations are 32 bit
  121.            mov ebp,0
  122.            call put_object      ; plop..
  123.            mov bx,0             ; angles are 16 bit
  124.            mov cx,0
  125.            mov bp,0
  126.            call set_angle       ; duhhh...i wonder what this call does...
  127.            call set_object_on   ; turn object si on (make visible)
  128.            mov userotate[esi],0 ; full rotations for this object (0)
  129.            mov ax,0
  130.            call set_shape       ; set object si to shape ax
  131.            mov ebx,000245100h   ; x,y,z angular velocities
  132.            mov ecx,000591500h   ; high word = number of turns/revolutions
  133.            mov ebp,000742300h   ; lo word = final angle (position)
  134.            mov di,28000         ; di = time to twist there (total frames)
  135.            call twist_si        ; set angular velocity
  136.            call set_finala      ; set final anglular position (pre-calculation)
  137.            mov ebx,o nullpalette  ; set cross referencing palette (null)
  138.            call set_xref_palette
  139.  
  140.            mov si,2
  141.            mov ebx,130000
  142.            mov ecx,0
  143.            mov ebp,50000
  144.            call put_object
  145.            mov bx,0
  146.            mov cx,1000
  147.            mov bp,7000
  148.            call set_angle
  149.            call set_object_on
  150.            mov userotate[esi],0
  151.            mov ax,1
  152.            call set_shape
  153.            mov ebx,000342000h
  154.            mov ecx,000624000h
  155.            mov ebp,000130000h
  156.            mov di,44000
  157.            call twist_si
  158.            call set_finala
  159.            mov ebx,o nullpalette
  160.            call set_xref_palette
  161.  
  162.            mov si,3
  163.            mov ebx,50000
  164.            mov ecx,70000
  165.            mov ebp,20000
  166.            call put_object
  167.            mov bx,0
  168.            mov cx,0
  169.            mov bp,0
  170.            call set_angle
  171.            call set_object_on
  172.            mov userotate[esi],0
  173.            mov ax,2
  174.            call set_shape
  175.            mov ebx,000310124h
  176.            mov ecx,0ffbc2340h
  177.            mov ebp,000530100h
  178.            mov di,16000
  179.            call twist_si
  180.            call set_finala
  181.            mov ebx,o nullpalette
  182.            call set_xref_palette
  183.  
  184.            mov si,4
  185.            mov ebx,50000
  186.            mov ecx,-50000
  187.            mov ebp,-20000
  188.            call put_object
  189.            mov bx,0
  190.            mov cx,0
  191.            mov bp,0
  192.            call set_angle
  193.            call set_object_on
  194.            mov userotate[esi],0
  195.            mov ax,3
  196.            call set_shape
  197.            mov ebx,000600000h
  198.            mov ecx,0fff23400h
  199.            mov ebp,000100000h
  200.            mov di,11000
  201.            call twist_si
  202.            call set_finala
  203.            mov ebx,o nullpalette
  204.            call set_xref_palette
  205.  
  206.            mov si,5
  207.            mov ebx,-70000
  208.            mov ecx,30000
  209.            mov ebp,-40000
  210.            call put_object
  211.            mov bx,0
  212.            mov cx,0
  213.            mov bp,0
  214.            call set_angle
  215.            call set_object_on
  216.            mov userotate[esi],0
  217.            mov ax,4
  218.            call set_shape
  219.            mov ebx,000200000h
  220.            mov ecx,000100000h
  221.            mov ebp,0ffa00000h
  222.            mov di,12000
  223.            call twist_si
  224.            call set_finala
  225.            mov ebx,o nullpalette
  226.            call set_xref_palette
  227.  
  228.            mov si,6             ; this next object is the bitmaped
  229.            mov ebx,-50000       ; cube, remove this and see the speed of
  230.            mov ecx,-30000       ; only vectors
  231.            mov ebp,10000
  232.            call put_object      ; note: the bitmaps take a lot of cpu time
  233.            mov bx,0
  234.            mov cx,0
  235.            mov bp,0
  236.            call set_angle
  237.            call set_object_on
  238.            mov userotate[esi],0
  239.            mov ax,5
  240.            call set_shape
  241.            mov ebx,000300000h
  242.            mov ecx,000700000h
  243.            mov ebp,000500000h
  244.            mov di,13000
  245.            call twist_si
  246.            call set_finala
  247.  
  248.            mov si,7             ; stand alone bitmap - good for smoke or
  249.            mov ebx,-5000        ; explosions
  250.            mov ecx,5000
  251.            mov ebp,25000
  252.            call put_object      ; set location
  253.            call set_object_on   ; turn it on
  254.            mov ax,0             ; zeroth bitmap is shape
  255.            call set_shape       ; will load from bitbase[0]
  256.            mov vxs[esi*2],50    ; bitmap scaling (gets added to bitx and bity)
  257.            mov vys[esi*2],50    ; bitmap scaling
  258.            mov userotate[esi],himap  ; it's a bitmap (32)
  259.  
  260.            mov ebx,eyexq
  261.            mov ecx,eyeyq
  262.            mov ebp,eyezq
  263.            mov di,eyetime
  264.            mov esi,cameraobject
  265.            call move_si
  266.            call set_finall
  267.  
  268.            mov si,1             ; follow first object
  269.            mov di,55            ; 55 frames to get there
  270.            call newfollow
  271.  
  272.            mov bitx+4*0,15          ; base bitmap scaling
  273.            mov bity+4*0,15
  274.            mov bitbase+4*0,o sphere
  275.            mov bitx+4*1,15          ; base bitmap scaling
  276.            mov bity+4*1,15
  277.            mov bitbase+4*1,o icon
  278.  
  279. ;          mov eyezadds,50      ; make the camera rotate along it's z axis (just for fun)
  280. ;          mov esi,cameraobject
  281. ;          call set_finala
  282.  
  283.            call reset_raster_count   ; done before any animation loop!!!
  284.            call init_tables          ; initialize 3d vector stuff
  285.  
  286. ;          mov si,5                  ; an example of how to use point_time
  287. ;          mov ebx,-10000            ; si = obj, bx,cx,bp = location, di = time
  288. ;          mov ecx,-30000
  289. ;          mov ebp,90000
  290. ;          mov di,150
  291. ;          call point_time
  292.  
  293. ; the main loop...
  294.  
  295. ieox:
  296. ;          mov si,6                  ; try uncommenting this!, this will point
  297. ;          mov di,cameraobject       ; the bitmapped cube at the camera. also
  298. ;          call point_it             ; uncomment it below, at ieox3:
  299.  
  300. ;          mov eax,your_problem      ; debugging tool!!!!
  301. ;          mov number_eax,eax
  302. ;          call put_at_top
  303.  
  304. ;          add y_angle_of_sun,150    ; watch the red ring carefully! the sun will move around the room!
  305.  
  306.            mov si,6                  ; move cube around...si - object
  307.            mov ebp,15000             ; ebp = speed (make it faster!)
  308.            mov di,600                ; di = total time (not in calculation)
  309.            call set_speed            ; move object in direction it is pointing
  310.            call set_finall           ; then calculate final position (not important as long as it keeps moving)
  311.  
  312.            call look_at_it           ; make camera look at selected object
  313.            call setsincose           ; set rotation multipliers for eye
  314.            call show_stars           ; plot background stars
  315.            call makeobjs             ; plot all objects in sides table
  316.  
  317.            cmp eyelcount,0
  318.            jnz dontmoveeye
  319.            inc w eyeloc
  320.            and w eyeloc,3
  321.            movzx esi,w eyeloc
  322.            mov ebx,eyexq[esi*4]
  323.            mov ecx,eyeyq[esi*4]
  324.            mov ebp,eyezq[esi*4]
  325.            mov di,eyetime[esi*2]
  326.            mov esi,cameraobject
  327.            call move_si
  328.            call set_finall
  329. dontmoveeye:
  330. ;          call instant_mouse        ; plot mouse on screen
  331.            call flip_page            ; flip video pages
  332.            call clear_fill           ; clear video memory (last screen)
  333.            call resetupd             ; reset borders
  334.  
  335.           ;mov ax,traces_past        ; show number of traces past per re-draw
  336.           ;mov number_eax,eax
  337.           ;call put_at_top
  338.  
  339.            call updvectors           ; move objects around, rotate them
  340.  
  341.            in al,60h                 ; test keyboard
  342.            cmp al,1
  343.            jne ieox
  344. ieox2:
  345.            in al,60h                 ; test keyboard
  346.            cmp al,1
  347.            je ieox2
  348.  
  349.            mov ax,w temp
  350.            cmp ax,6
  351.            jge ieox4
  352.  
  353.            inc w temp
  354.            inc ax
  355.            mov si,ax     ; ax = object
  356.            mov di,55     ; di = time to get there (# of frames)
  357.            call newfollow
  358.  
  359.            call reset_raster_count   ; done because esc key pressed!!!
  360.            jmp ieox
  361.  
  362. ; this is the part where the cube speeds away from you...and the program ends
  363.  
  364. ieox4:
  365.            call reset_raster_count   ; done before any animation loop!!!
  366.  
  367.            mov zadds[6*4],-12000     ; make cube move!
  368.            mov lcount[6*2],220       ; set counter 12000*220 = distance
  369. ieox3:
  370. ;          mov si,6                  ; try this!!
  371. ;          mov di,cameraobject
  372. ;          call point_it
  373.  
  374.            mov wherelook,6           ; force to look at sphered cube
  375.            call look_at_it
  376.            call setsincose
  377.            call show_stars           ; plot background stars
  378.            call makeobjs
  379.  
  380.            call flip_page
  381.            call clear_fill
  382.            call resetupd
  383.            call updvectors
  384.  
  385.            in al,60h                 ; test keyboard
  386.            cmp al,1
  387.            je getout
  388.  
  389.            mov ax,lcount[6*2]        ; check end counter (done flag)
  390.            cmp ax,0
  391.            jne ieox3
  392. getout:
  393.            call reset_rmirq  ; use one or the other, could use both if
  394. ;          call reset_pmirq  ; needed but delete inc traces_past from pmode
  395.  
  396.            jmp endpage       ; jump to stuff.inc for ending
  397.  
  398. temp       dw 1              ; next object to look at, for this demo only
  399. eyeloc     dw 0              ; indexer for camera (this demo only)
  400. eyexq      dd 195000,180000,-240000,-280000
  401. eyeyq      dd -30000,25000,-35000,30000
  402. eyezq      dd -270000,310000,240000,-220000
  403. eyetime    dw 220,254,220,180
  404.  
  405.            public objbase    ; make sure these are here even if you don't
  406.            public bitbase    ; use them.  tlink will fail if not present.!
  407.            public bitx
  408.            public bity
  409.  
  410. numberofobjects equ 32       ; number of 3d objects to allocate space for
  411. numberofbitmaps equ 32       ; number of 3d bitmaps to allocate space for
  412.  
  413.            align 4
  414.  
  415. objbase    dd numberofobjects*4 dup (0) ; memory locations of shapes (offsets)
  416. bitbase    dd numberofbitmaps dup (0)   ; memory locations of bitmaps
  417. bitx       dd numberofbitmaps dup (0)   ; x base size of bitmaps (for 3d)
  418. bity       dd numberofbitmaps dup (0)   ; y base size of bitmaps
  419.  
  420. code32     ends
  421.            end
  422.